package com.example.hctorisrael.deadolympics;

import org.andengine.engine.Engine;

/**
 * Administra la escena que se verá en la pantalla
 */
public class AdministradorEscenas
{
    // Instancia única
    private static final AdministradorEscenas INSTANCE = new AdministradorEscenas();

    // Declara las distintas escenas que forman el juego
    private EscenaBase escenaSplash;
    private EscenaBase escenaMenu;
    private EscenaBase escenaAcercaDe;
    private EscenaBase escenaJuego;
    private EscenaBase escenaScores;
    private EscenaBase escenaGanaste;
    private EscenaBase escenaJuegoDos;
    private EscenaBase escenaJuegoTres;
    private EscenaBase escenaEstadoJuego;
    private EscenaBase escenaAyuda;
    private EscenaBase escenaPerdiste;

    // El tipo de escena que se está mostrando
    private TipoEscena tipoEscenaActual = TipoEscena.ESCENA_SPLASH;
    // La escena que se está mostrando
    private EscenaBase escenaActual;
    // El engine para hacer el cambio de escenas
    private Engine engine = AdministradorRecursos.getInstance().engine;
    // El administrados de recursos
    private AdministradorRecursos admRecursos = AdministradorRecursos.getInstance();

    // Regresa la instancia del administrador de escenas
    public static AdministradorEscenas getInstance() {
        return INSTANCE;
    }

    // Regresa el tipo de la escena actual
    public TipoEscena getTipoEscenaActual() {
        return tipoEscenaActual;
    }

    // Regresa la escena actual
    public EscenaBase getEscenaActual() {
        return escenaActual;
    }

    /*
     * Pone en la pantalla la escena que llega como parámetro y guarda el nuevo estado
     */
    private void setEscenaBase(EscenaBase nueva) {
        engine.setScene(nueva);
        escenaActual = nueva;
        tipoEscenaActual = nueva.getTipoEscena();
    }

    /**
     * Cambia a la escena especificada en el parámetro
     * @param nuevoTipo la nueva escena que se quiere mostrar
     */
    public void setEscena(TipoEscena nuevoTipo) {
        switch (nuevoTipo) {
            case ESCENA_SPLASH:
                setEscenaBase(escenaSplash);
                break;
            case ESCENA_ESTADO:
                setEscenaBase(escenaEstadoJuego);
                break;
            case ESCENA_MENU:
                setEscenaBase(escenaMenu);
                break;
            case ESCENA_ACERCA_DE:
                setEscenaBase(escenaAcercaDe);
                break;
            case ESCENA_SCORES:
                setEscenaBase(escenaScores);
                break;
            case ESCENA_JUEGO:
                setEscenaBase(escenaJuego);
                break;
            case ESCENA_JUEGODOS:
                setEscenaBase(escenaJuegoDos);
                break;
            case ESCENA_JUEGOTRES:
                setEscenaBase(escenaJuegoTres);
                break;
            case ESCENA_AYUDA:
                setEscenaBase(escenaAyuda);
                break;
            case ESCENA_PERDISTE:
                setEscenaBase(escenaPerdiste);
                break;
        }
    }

    //*** Crea la escena de Splash
    public void crearEscenaSplash() {
        // Carga los recursos
        admRecursos.cargarRecursosSplash();
        escenaSplash = new EscenaSplash();
    }

    //*** Libera la escena de Splash
    public void liberarEscenaSplash() {
        admRecursos.liberarRecursosSplash();
        escenaSplash.liberarEscena();
        escenaSplash = null;
    }

    public void crearEscenaEstado(){
        admRecursos.cargarRecursosEstadoJuego();
        escenaEstadoJuego = new EscenaEstado();
    }

    public void liberarEscenaEstado(){
        admRecursos.liberarRecursosEstadoJuego();
        escenaEstadoJuego.liberarEscena();
        escenaEstadoJuego = null;
    }

    public void crearEscenaPerdiste(){
        admRecursos.cargarRecursosPerdiste();
        escenaPerdiste = new EscenaPerdiste();
    }

    public void liberarEscenaPerdiste(){
    admRecursos.liberarRecursosPerdiste();
    escenaPerdiste.liberarEscena();
    escenaPerdiste = null;

    }

    // ** MENU
    //*** Crea la escena de MENU
    public void crearEscenaMenu() {
        // Carga los recursos
        admRecursos.cargarRecursosMenu();
        escenaMenu = new EscenaMenu();
    }

    //*** Libera la escena de MENU
    public void liberarEscenaMenu() {
        admRecursos.liberarRecursosMenu();
        escenaMenu.liberarEscena();
        escenaMenu = null;
    }

    //*** Crea la escena de Acerca De
    public void crearEscenaAcercaDe() {
        // Carga los recursos
        admRecursos.cargarRecursosAcercaDe();
        escenaAcercaDe = new EscenaAcercaDe();
    }

    //*** Libera la escena de Acerca de
    public void liberarEscenaAcercaDe() {
        admRecursos.liberarRecursosAcercaDe();
        escenaAcercaDe.liberarEscena();
        escenaAcercaDe = null;
    }

    //*** Crea la escena de Scores
    public void crearEscenaScores() {
        // Carga los recursos
        admRecursos.cargarRecursosScores();
        escenaScores = new EscenaScores();
    }

    //*** Libera la escena de Scores
    public void liberarEscenaScores() {
        admRecursos.liberarRecursosScores();
        escenaScores.liberarEscena();
        escenaScores = null;
    }

    //*** Crea la escena de Ayuda
    public void crearEscenaAyuda() {
        admRecursos.cargarRecursosAyuda();
        escenaAyuda = new EscenaAyuda();
    }

    //*** Libera la escena de Ayuda
    public void liberarEscenaAyuda() {
        admRecursos.liberarRecursosAyuda();
        escenaAyuda.liberarEscena();
        escenaAyuda = null;
    }


    //*** Crea la escena de Juego
    public void crearEscenaJuego() {
        // Carga los recursos
        admRecursos.cargarRecursosJuego();
        escenaJuego = new EscenaJuego();
    }

    //*** Libera la escena de Juego
    public void liberarEscenaJuego() {
        admRecursos.liberarRecursosJuego();
        escenaJuego.liberarEscena();
        escenaJuego = null;
    }

    public void crearEscenaGanaste() {
        // Carga los recursos
        admRecursos.cargarRecursosGanaste();
        //escenaGanaste = new EscenaGanaste();
    }

    //*** Libera la escena de Scores
    public void liberarEscenaGanaste() {
        admRecursos.liberarRecursosGanaste();
        escenaGanaste.liberarEscena();
        escenaGanaste = null;
    }

    //*** Crea la escena de Juego Dos
    public void crearEscenaJuegoDos(){
        admRecursos.cargarRecursosJuego2();
        escenaJuegoDos = new EscenaJuegoDos();
    }

    //*** Liberar la escena de Juego Dos
    public void liberarEscenaJuegoDos(){
        admRecursos.liberarRecursosJuego2();
        escenaJuegoDos.liberarEscena();
        escenaJuegoDos = null;
    }

    //**Crea la escena juego tres
    public void crearEscenaJuegoTres(){
        admRecursos.cargarRecursosJuego3();
        escenaJuegoTres = new EscenaJuegoTres();
    }
    //**Libera la escena juego tres
    public void liberarEscenaJuegoTres(){
        admRecursos.liberarRecursosJuego3();
        escenaJuegoTres.liberarEscena();
        escenaJuegoTres = null;
    }
}
